package com.gxa.xiaoucomeshome.utils;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Map;

/**
 * 数字格式化类 个日期格式化类
 *
 * @author 930437
 */
@SuppressWarnings("all")
public class FormatTool {
    private static SimpleDateFormat simpleDateFormat;
    private static DecimalFormat decimalFormat;//
    private static final String EDATE_PATTERN = "yyyy-MM-dd";//英文版的 年月日
    private static final String EDATETIME_PATTERN = "yyyy-MM-dd  HH:mm:ss";//英文版的年月日时分秒
    private static final String CDATETIME_PATTERN = "yyyy年MM月dd日  HH:mm:ss";//中文版的 年月日
    private static final String CDATE_PATTERN = "yyyy年MM月dd日";
    /*第一:该类提供如下方法将Date对象转换为指定模式的字符串对象,将字符串日期时间按照指定模式解析为日期时间对象;
     * Date  --->  String
     * 1.yyyy-MM-dd
     * 2.yyyy-MM-dd  HH:mm:ss
     * 3.yyyy年MM月dd日
     * 4.yyyy年MM月dd日  HH:mm:ss
     * 5.指定格式
     *
     * String  --->  Date
     * */

    static public String getStringNewDate() {
        return getStringDate(new Date(), EDATE_PATTERN);
    }

    /**
     * 把日期按 yyyy-MM-dd默认格式进行解析成字符串
     *
     * @param date 日期
     * @return
     */
    static public String getStringDate(Date date) {
        return getStringDate(date, EDATE_PATTERN);
    }

    /**
     * 把日期按 yyyy-MM-dd  HH:mm:ss 默认格式进行解析成字符串
     *
     * @param date 日期
     * @return
     */
    static public String getStringDateTime(Date date) {
        return getStringDate(date, EDATETIME_PATTERN);
    }

    /**
     * 把日期按 yyyy年MM月dd日 默认格式进行解析成字符串
     *
     * @param date 日期
     * @return
     */
    static public String getStringChinaDate(Date date) {
        return getStringDate(date, CDATE_PATTERN);
    }

    /**
     * 把日期按 yyyy年MM月dd日  HH:mm:ss 默认格式进行解析成字符串
     *
     * @param date 日期
     * @return
     */
    static public String getStringChinaDateTime(Date date) {
        return getStringDate(date, CDATETIME_PATTERN);
    }

    /**
     * 用户自己给指定的格式进行解析
     *
     * @param date
     * @param pattern
     * @return
     */
    static public String getStringDate(Date date, String pattern) {
        simpleDateFormat = new SimpleDateFormat(pattern);
        return simpleDateFormat.format(date);
    }

    /**
     * 按指定格式进行解析字符串
     *
     * @param time
     * @param pattern
     * @return
     * @
     */
    static public Date getDate(String time, String pattern) {//抛出
        simpleDateFormat = new SimpleDateFormat(pattern);
        if (time == null || formatString(time) == null) {
            return null;
        }
        try {
            return simpleDateFormat.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 把字符串按照  yyyy-MM-dd 进行解析成 Date
     *
     * @param time
     * @return
     * @
     */
    static public Date getDate(String time) {
        return getDate(time, EDATE_PATTERN);
    }

    /**
     * 把字符串按照  yyyy-MM-dd HH:mm:ss 进行解析成 Date
     *
     * @param time
     * @return
     * @
     */
    static public Date getDateTime(String time) {
        return getDate(time, EDATETIME_PATTERN);
    }

    /**
     * 把字符串按照  yyyy年MM月dd日  进行解析成 Date
     *
     * @param time
     * @return
     * @
     */
    static public Date getChinaDate(String time) {
        return getDate(time, CDATE_PATTERN);
    }

    /**
     * 把字符串按照  yyyy年MM月dd日  HH:mm:ss  进行解析成 Date
     *
     * @param time
     * @return
     * @
     */
    static public Date getChinaDateTime(String time) {
        return getDate(time, CDATETIME_PATTERN);
    }

    // 判断字符是否为空

    /**
     * 判断字符串是不是null 如果是"" null 返回null 如果字符串去掉首位空格还有字符那么返回去掉首位空格的字符
     *
     * @param str
     * @return
     */
    static public String formatString(String str) {// "" null " aaa " aaa
        if (str != null && str.trim().length() > 0) {
            return str.trim();
        }
        return null;
    }

    static public boolean isLine(String str) {// "" null " aaa " aaa
        if (str != null && str.trim().length() > 0) {
            return str.equals("--");
        }
        return false;
    }


    /**
     * 判断字符串是不是数字int 如果是返回 数字 不如不是返回null
     *
     * @param str
     * @return
     */
    static public Integer formatInteger(String str) {// "" null " aaa " aaa
        if (str != null && str.trim().length() > 0) {
            try {
                return Integer.parseInt(str);
            } catch (Exception e) {
                return null;
            }
        }
        return null;
    }

    /**
     * 判断字符串是不是数字Double 如果是返回 数字Double 不如不是返回null
     *
     * @param str
     * @return
     */
    static public Double formatDouble(String str) {// "" null " aaa " aaa
        return formatDouble(str, -1);
    }

    /**
     * 判断字符串是不是数字Double 如果是返回 数字Double 保留decimal_Places为小数 不如不是返回null
     *
     * @param str
     * @param decimal_Places
     * @return
     */
    static public Double formatDouble(String str, int decimal_Places) {// ""
        // null
        // " aaa
        // " aaa

        if (str != null && str.trim().length() > 0) {
            try {
                double number = Double.parseDouble(str);
                if (decimal_Places > -1) {
                    // 保留decimal_Places位小数
                    number = Double.parseDouble(String.format("%." + decimal_Places + "f", number));
                }
                return number;

            } catch (Exception e) {
                System.out.println(e);
                return null;
            }
        }
        return null;
    }

    public void dateFormat(Map<String, Object> map, String key) {
        //Localdatetime格式
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
        //时间戳转时间
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");

        if(map.get(key)!=null){
            Object o = map.get(key);
            LocalDateTime parse = LocalDateTime.parse(o.toString(), dateTimeFormatter);
            Date date = Date.from( parse.atZone( ZoneId.systemDefault()).toInstant());
            String value = simpleDateFormat.format(date);
            map.put(key, value);
        }
    }
}